#include "Path.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

Path::Path() {
    camino = new list<int>; // inicio el camino vacio
    costoCamino = 0; //FIXME
}

Path::Path(Path * p) { // construyo el camino a partir de uno..
    camino = new list<int>;
    for (list<int>::iterator it = p->camino->begin(); it != p->camino->end(); it++) {
        camino->push_back(*it);
    }
    costoCamino=p->costoCamino; //FIXME
}

bool Path::caminoVacio() {
    return camino->empty();
}

// retorna un nuevo camino, subcamino de p, de inicio i y fin j.

Path* Path::subCamino(int i, int j) {

    list<int>::iterator it_i;
    list<int>::iterator it_j;
    Path* caminoAux = new Path();
    //chequear si existe el camino previo

    // recorre hasta enc y devuelve el subcamino

    for (list<int>::iterator it = it_i; it != it_j; ++it)
        caminoAux->camino->push_front(*it);

    return caminoAux;

}

bool Path::contieneNodo(int node) {

    for (list<int>::iterator it = camino->begin(); it != camino->end(); ++it)
        if ((*it) == node) return true;

    return false;
}

bool Path::contieneArista(pair<int, int> * edge) {

    list<int>::iterator _it;
    for (list<int>::iterator it = camino->begin(); it != camino->end(); ++it) {
        if (*it == edge->first || *it == edge->second) {
            if (*it == edge->first) {
                _it = it;
                _it++;
                return (*_it == edge->second);
            } else {
                _it = it;
                _it++;
                return (*_it == edge->first);
            }
        }
    }
    return false;
}

int Path::getLargo() {
	return this->camino->size();
}

bool Path::iguales(Path * p) {
	list<int>::iterator it2=p->camino->begin();
	list<int>::iterator it=this->camino->begin();
	while(it!=this->camino->end() && it2!=p->camino->end() && it==it2){
		it++;
		it2++;
	}
	return (it==this->camino->end()) && (it2==p->camino->end());
}

float Path::getCosto() {
	return this->costoCamino;
}

void Path::agregarNodo(int nodo) {
	this->camino->push_back(nodo);
}

Path::~Path() {
}
